package net.servir.capacidades.web.controller;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.servir.capacidades.model.Censo;
import net.servir.capacidades.model.Estudios;
import net.servir.capacidades.model.Etapa;
import net.servir.capacidades.model.FuncionLeyenda;
import net.servir.capacidades.model.MayorGradoAcademico;
import net.servir.capacidades.model.Profesion;
import net.servir.capacidades.model.PuestoTipo;
import net.servir.capacidades.model.Regimen;
import net.servir.capacidades.model.Responsable;
import net.servir.capacidades.model.ResponsableIdentificacion;
import net.servir.capacidades.model.ServicioCivil;
import net.servir.capacidades.model.SistemaEtapa;
import net.servir.capacidades.model.Snip;
import net.servir.capacidades.model.Test;
import net.servir.capacidades.model.TipoDocumento;
import net.servir.capacidades.model.TipoObservacion;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.service.CapacidadesService;
import net.servir.capacidades.service.MantenimientoService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ServicioCivilEdicionController {

	@Autowired
	private CapacidadesService capacidadesService;

	@Autowired
	private MantenimientoService mantenimientoService;

	// @Autowired
	// private CensoService censoService ;

	@RequestMapping("/servicioCivilEdicion.htm")
	public @ModelAttribute("servicioCivilEdicion")
	ServicioCivil servicioCivil(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		ServicioCivil obj = new ServicioCivil();

		// ************************************************************
		// se obtiene el dni de la session activa
		// ************************************************************
		HttpSession session = request.getSession();
		String cod_session = session.getId();

		String dniResponsable = null;
		String dniUsuario = null;
		if (session.getAttribute("dni") != null)
			dniUsuario = session.getAttribute("dni").toString();

		// Obtenemos los datos del responsable
		Usuario usuario = null;
		if (session.getAttribute("usuario") != null)
			usuario = (Usuario) session.getAttribute("usuario");

		if (usuario == null)
			throw new Exception("No se ha identificado al usuario");

		// ************************************************************

		Censo censo = new Censo();
		censo.setCod_session(cod_session);
		session.setAttribute("finalizar", "0");

		String mensaje = "";
		String codRegimen = "";
		String codProfesion = "";
		Number idServicioCivil = 0;
		Number idAmbito = 0;
		Number idEjecutora = 0;
		String nombres = "";
		String apellidoPaterno = "";
		String apellidoMaterno = "";
		String codTipoDoc = "";
		String dni = "";
		String sexo = "";
		String fecNacimiento = "";
		String telefono = "";
		String correo = "";
		String accion = "";
		// String formEdicion="";
		String tipoEdicion = "";
		String codEstado = "";
		String jefe = "";
		Number idPuestoTipo = null;
		Number id_sistema_etapa = 0;
		Number id_puesto_tipo_ant = 0;
		Integer plazo = 0;
		String detalleObservacion = "";
		String detalleSubsanacion = "";
		String codTipoObservacion = "";
		String estadoObservacion = "";
		String estadoSubsanacion = "";
		String estado_equipo = "";
		Integer idSistema = 0;
		
		//Se agregan los nuevos campos  - JM  - 
		String correo_alterno = "";
		LinkedList<MayorGradoAcademico> mayorGradoAcademico;
		String cod_grado_academico="";  
		LinkedList<Snip> obtenerSnip;                       
		String cod_experiencia_snip;  
		LinkedList<Estudios> estudios;                      
		String cod_estudios;      
		String titulo_universitario;  
		Integer aplicaFuncionPersonalizada;
		String otrosestudios = "";
		String universidad = "";
		
		String isFuncionPersonalizada = "";
		
		String listaFunciones = "";
		List<Number> idFuncionesParticipante = new ArrayList<Number>();
		String[] arrayFunciones = listaFunciones.split(",");
		
		// ************************************************************
		// Obtenemos los parametros generales
		// ************************************************************
		if (request.getParameter("idServicioCivil") != null
				&& !request.getParameter("idServicioCivil").toString()
						.equals(""))
			idServicioCivil = Integer.parseInt(request
					.getParameter("idServicioCivil"));

		if (request.getParameter("idAmbito") != null
				&& !request.getParameter("idAmbito").toString().equals(""))
			idAmbito = Integer.parseInt(request.getParameter("idAmbito"));

		if (request.getParameter("idEjecutora") != null
				&& !request.getParameter("idEjecutora").toString().equals(""))
			idEjecutora = Integer.parseInt(request.getParameter("idEjecutora"));

		if (request.getParameter("accion") != null
				&& !request.getParameter("accion").toString().equals(""))
			accion = request.getParameter("accion").toString();

		if (request.getParameter("tipo_edicion") != null
				&& !request.getParameter("tipo_edicion").toString().equals(""))
			tipoEdicion = request.getParameter("tipo_edicion").toString();

		if (request.getParameter("estadoSubsanacion") != null
				&& !request.getParameter("estadoSubsanacion").toString()
						.equals(""))
			estadoSubsanacion = request.getParameter("estadoSubsanacion")
					.toString();
		if (request.getParameter("id_sistema_etapa") != null && !request.getParameter("id_sistema_etapa").equals(""))
			id_sistema_etapa = (Integer.parseInt(request.getParameter("id_sistema_etapa")));
		
		estado_equipo = "0";
		if (request.getParameter("estado_equipo") != null)
			estado_equipo = request.getParameter("estado_equipo").trim();
		
		if(request.getParameter("tlistfuncion") != null && !request.getParameter("tlistfuncion").equals(""))
			listaFunciones = request.getParameter("tlistfuncion");
		
		LinkedList<Test> testsDiagnostico;
		
		if (idServicioCivil.intValue() > 0) {
			obj = capacidadesService.ObtenerServicioCivil(idServicioCivil);
			testsDiagnostico = capacidadesService.ObtenerTestDiagnoticoPorDNI(obj.getDni(), obj.getId_persona());
			obj.setTestsDiagnostico(testsDiagnostico);
			Integer numTestDiagnostico = testsDiagnostico.size();
			obj.setNumTestDiagnostico(numTestDiagnostico);
			obj.setTipo_edicion("EDIT");
			idEjecutora = obj.getId_ejecutora();
			obj.setId_ejecutora(idEjecutora);
			idAmbito = obj.getId_ambito();
			//obj.setId_ambito(idAmbito);
			id_sistema_etapa = obj.getId_sistema_etapa();
			idPuestoTipo = obj.getId_puesto_tipo();
			id_puesto_tipo_ant = obj.getId_puesto_tipo();
			obj.setId_puesto_tipo_ant(id_puesto_tipo_ant);
			dniResponsable = obj.getDniResponsableEntidad();
			List<PuestoTipo> optPuestoTipo = mantenimientoService.getPuestoTipos(obj.getId_sistema());
			obj.setOptPuestoTipo(optPuestoTipo);
			int funcioPersonalizadaResultado = capacidadesService.AplicaFuncionesPersonalizadas(obj.getId_responsable());
			if(funcioPersonalizadaResultado==0){
				obj.setAplicaFuncionPersonalizada("NO");
			}else{
				obj.setAplicaFuncionPersonalizada("SI");
			}
		} else {
			obj.setTipo_edicion("NEW");
			obj.setId_ejecutora(idEjecutora);
			obj.setId_ambito(idAmbito);
			obj.setCod_estado("INIC");
			// obj.setForm_edicion(formEdicion);
		}

		// Configura el usuario
		obj.setUsuario(usuario);
		
		if (request.getParameter("id_sistema_etapa") != null && !request.getParameter("id_sistema_etapa").equals(""))
			id_sistema_etapa = (Integer.parseInt(request.getParameter("id_sistema_etapa")));
		obj.setId_sistema_etapa(id_sistema_etapa);
		if(request.getParameter("id_puesto_tipo")!=null && !request.getParameter("id_puesto_tipo").equals("") && !request.getParameter("id_puesto_tipo").equals("0"))
			idPuestoTipo = Integer.parseInt(request.getParameter("id_puesto_tipo"));
		
		//if (!obj.getCod_estado().equals("CONF") && !obj.getCod_estado().equals("MODI") )
		
		
		// ************************************************************
		// para los casos de solo lectura
		if (tipoEdicion.equals("VER")) {
			obj.setTipo_edicion(tipoEdicion);
			// mensaje =
			// "El responsable de la entidad aún no finaliza el censo, por lo cual no es posible editar los datos del operador.";
			mensaje = "Los datos del operador están disponibles sólo para lectura.";
		}

		LinkedList<Regimen> regimenes = capacidadesService.ObtenerRegimen();
		LinkedList<TipoObservacion> tipoObservaciones = capacidadesService
				.ObtenerTipoObservacion();
		LinkedList<Profesion> profesiones = capacidadesService
				.ObtenerProfesion();
		LinkedList<TipoDocumento> documentos = capacidadesService
				.ObtenerTipoDocumento();
		LinkedList<ResponsableIdentificacion> responsableIdentificacion = capacidadesService
				.ObtenerResponsableIdentificacion(dniResponsable);
		List funciones = capacidadesService.ObtenerFunciones(idServicioCivil);
		//Se llenan los campos nuevos: JM 
		mayorGradoAcademico = capacidadesService.ObtenerMayorGradoAcademico();                       
		obtenerSnip = capacidadesService.ObtenerSnip();   
		estudios = capacidadesService.ObtenerEstudios(); 
		
		ResponsableIdentificacion responsable = null;
		Responsable responsableCenso = null;
		// Obtenemos los datos del responsable
		if (dniResponsable != null && !dniResponsable.equals("0")
				&& !dniResponsable.equals("")) {
			responsable = capacidadesService.GetResponsableIdentificacion(dniResponsable);
			responsableCenso = capacidadesService.GetResponsable(responsable.getId_responsable().intValue());
		}
		//Se llenan los campos nuevos: JM 
		obj.setMayorGradoAcademico(mayorGradoAcademico);
		obj.setObtenerSnip(obtenerSnip);
		obj.setEstudios(estudios);
		
		//Obtenemos los datos Nivel de Gobierno para capturar las etapas del responsable
		Integer idNivelGobierno=capacidadesService.ObtenerIdNivelGobierno(idEjecutora);
		if(responsable!=null){
			aplicaFuncionPersonalizada = capacidadesService.AplicaFuncionesPersonalizadas(responsable.getId_responsable());	
		}else{
			aplicaFuncionPersonalizada=0;
		}
		
		idFuncionesParticipante = capacidadesService.ObtenerIdFuncionesSC(idServicioCivil);
		
		List<Etapa> etapas =null;
		
		//validamos ahora funciones personalizadas
//		etapas = capacidadesService.ObtenerEtapasAmbitoPersonalizado(idAmbito,idEjecutora);
//		
		String validarPersonalizada="[]";
//		if(validarPersonalizada.equals(String.valueOf(etapas))){
//			etapas = capacidadesService.ObtenerEtapasNivelGobierno(idNivelGobierno, aplicaFuncionPersonalizada);
//		}
		
		PuestoTipo puestoTipo = new PuestoTipo();
		// Obtiene funciones
		if (!id_sistema_etapa.equals(0) && !idPuestoTipo.equals(0)){
			puestoTipo = capacidadesService.getPuestoTipo(idPuestoTipo);
			if (puestoTipo.getCod_grupo().equals("J")) {
				isFuncionPersonalizada = "1";
			} else {
				isFuncionPersonalizada = "2";
				if (accion == null || accion.equals("")) {
				} else {
					idFuncionesParticipante = new ArrayList<Number>();
					if (!listaFunciones.equals("")) {
						if (idPuestoTipo == id_puesto_tipo_ant) {
							arrayFunciones = listaFunciones.split(",");
							for (int i = 0; i < arrayFunciones.length; i++) {
								idFuncionesParticipante.add(Integer.parseInt(arrayFunciones[i]));
							}
						}
					}
					obj.setId_funciones_participante(idFuncionesParticipante);
				}
			}
			// Se añad código para el caso de que se visualize responsables
//			System.out.println("responsableCenso.getDni() = "+responsableCenso.getDni());
//			System.out.println("obj.getDni() = "+obj.getDni());
			if (responsableCenso.getDni().equals(obj.getDni()) ){
				isFuncionPersonalizada = "3";
			}
//			System.out.println("isFuncionPersonalizada = "+isFuncionPersonalizada);
			aplicaFuncionPersonalizada= capacidadesService.AplicaFuncionesPersonalizadas(obj.getId_responsable());
			etapas = capacidadesService.ObtenerEtapasAmbitoPersonalizado(idAmbito,idEjecutora,isFuncionPersonalizada,obj.getId_sistema_etapa()); //ahora se le pasa el id_ejecutora
//			System.out.println("etapas ========= ");
//			System.out.println("listaFunciones" + listaFunciones);
		}
		obj.setIsFuncionPersonalizada(isFuncionPersonalizada);
		obj.setTipoObservaciones(tipoObservaciones);
		obj.setRegimenes(regimenes);
		obj.setProfesiones(profesiones);
		obj.setTipoDocumentos(documentos);
		obj.setResponsable(responsable);
		obj.setResponsableEntidad(responsableCenso);
		obj.setResponsableIdentificacion(responsableIdentificacion);
		obj.setEtapas(etapas);
		obj.setId_funciones_participante(idFuncionesParticipante);
		
		if (isFuncionPersonalizada.equals("1")) {
			for (Etapa etapa : etapas) {
				for (FuncionLeyenda funcion : etapa.getFunciones()) {
					funcion.setChecked(1);
				}
			}
		} else {
			for (Etapa etapa : etapas) {
				for (FuncionLeyenda funcion : etapa.getFunciones()) {
					for (Number id_fun_sel : idFuncionesParticipante) {
						if (funcion.getId_funcion().intValue() == id_fun_sel
								.intValue()) {
							funcion.setChecked(1);
						}
					}
				}
			}
		}

		nombres = request.getParameter("tnombre");
		if (nombres != null)
			nombres = nombres.toUpperCase();

		apellidoPaterno = request.getParameter("tapellido_paterno");
		if (apellidoPaterno != null)
			apellidoPaterno = apellidoPaterno.toUpperCase();

		apellidoMaterno = request.getParameter("tapellido_materno");
		if (apellidoMaterno != null)
			apellidoMaterno = apellidoMaterno.toUpperCase();

		dni = request.getParameter("tdni");
		fecNacimiento = request.getParameter("tfec_nacimiento");
		telefono = request.getParameter("ttelefono");
		correo = request.getParameter("tcorreo");
		//Se agregan los nuevos campos - JM -
		correo_alterno = request.getParameter("tcorreoAlterno");
		cod_grado_academico=request.getParameter("lgradoacademico");   
		cod_experiencia_snip = request.getParameter("lanioexperienciasnip");  
		cod_estudios = request.getParameter("lestudios");  
		titulo_universitario=request.getParameter("ctitulouniversitario"); 
		otrosestudios = request.getParameter("otrosestudios");
		universidad = request.getParameter("universidad");
		
		sexo = request.getParameter("csexo");
		jefe = request.getParameter("cjefe");

//		if (request.getParameter("id_puesto_tipo") != null
//				&& !request.getParameter("id_puesto_tipo").equals("0"))
//			idPuestoTipo = Integer.parseInt(request
//					.getParameter("id_puesto_tipo"));

		codEstado = request.getParameter("cod_estado");
		if (request.getParameter("lregimen") != null
				&& !request.getParameter("lregimen").trim().equals("")
				&& !request.getParameter("lregimen").trim().equals("0"))
			codRegimen = request.getParameter("lregimen");
		if (request.getParameter("lprofesion") != null
				&& !request.getParameter("lprofesion").trim().equals("")
				&& !request.getParameter("lprofesion").trim().equals("0"))
			codProfesion = request.getParameter("lprofesion");
		if (request.getParameter("lcod_tipo_doc") != null
				&& !request.getParameter("lcod_tipo_doc").trim().equals(""))
			codTipoDoc = request.getParameter("lcod_tipo_doc");
		if (request.getParameter("detalleSubsanacion") != null
				&& !request.getParameter("detalleSubsanacion").trim()
						.equals(""))
			detalleSubsanacion = request.getParameter("detalleSubsanacion")
					.toUpperCase();

		// DATOS DE LA OBSERVACION
		if (request.getParameter("detalleObservacion") != null
				&& !request.getParameter("detalleObservacion").trim()
						.equals(""))
			detalleObservacion = request.getParameter("detalleObservacion")
					.toUpperCase();
		if (request.getParameter("codTipoObservacion") != null
				&& !request.getParameter("codTipoObservacion").toString()
						.equals(""))
			codTipoObservacion = request.getParameter("codTipoObservacion")
					.toString();
		if (request.getParameter("tplazo") != null
				&& !request.getParameter("tplazo").toString().equals(""))
			plazo = Integer.parseInt(request.getParameter("tplazo").toString());
		if (request.getParameter("estadoObservacion") != null
				&& !request.getParameter("estadoObservacion").toString()
						.equals(""))
			estadoObservacion = request.getParameter("estadoObservacion")
					.toString();

		if (request.getParameter("idSistema") != null
				&& !request.getParameter("idSistema").equals("0")) {
			idSistema = Integer.parseInt(request.getParameter("idSistema"));
			obj.setId_sistema(idSistema);
		}
		
		LinkedList<SistemaEtapa> listaSistemaEtapa = capacidadesService.ObtenerSistemaEtapa((Number)idAmbito);
		obj.setSistemaEtapa(listaSistemaEtapa);

//		System.out.println("Accion : " + accion);
//		System.out.println("tipoEdicion : " + tipoEdicion);
		if (accion != null && !accion.equals("")) {
			// Actualizamos el objeto con los valores del formulario
			obj.setNombres(nombres.trim());
			obj.setApellido_paterno(apellidoPaterno.trim());
			obj.setApellido_materno(apellidoMaterno.trim());
			obj.setDni(dni.trim());
			if (fecNacimiento != null)
				obj.setFec_nacimiento(fecNacimiento.trim());
			if (telefono != null)
				obj.setTelefono(telefono.trim());
			obj.setCorreo(correo.trim().toUpperCase());
			//Se agregan los nuevos campos - JM -
			obj.setCorreo_alterno(correo_alterno.trim().toUpperCase());
			obj.setCod_grado_academico(cod_grado_academico);
			obj.setCod_experiencia_snip(cod_experiencia_snip);
			obj.setCod_estudios(cod_estudios);
			obj.setTitulo_universitario(titulo_universitario);
			obj.setOtrosestudios(otrosestudios);
			obj.setUniversidad(universidad);
			
			obj.setSexo(sexo);
			obj.setCod_estado(codEstado);

			if (!codRegimen.equals(""))
				obj.setCod_regimen(codRegimen);
			if (!codProfesion.equals(""))
				obj.setCod_profesion(codProfesion);
			obj.setCod_tipo_doc(codTipoDoc);

			if (idPuestoTipo != null)
				obj.setId_puesto_tipo(idPuestoTipo.intValue());

			//obj.setJefe(mantenimientoService.esJefePuestoTipo(idPuestoTipo));

			obj.setPlazo(plazo);
			obj.setDetalle_observacion(detalleObservacion);
			obj.setCod_tipo_observacion(codTipoObservacion);
			obj.setDetalle_subsanacion(detalleSubsanacion);
			obj.setEstado_equipo(estado_equipo);

//			String listaFunciones = "";
			Boolean validar = false;
			Boolean invalidar = false;
			Boolean observar = false;
			Boolean subsanar = false;
			Boolean reenviarcorreo = false;
			Boolean reenviarNuevoCorreo = false;
			Boolean editar = false;
			String estado = "";
			// Reservar el estado del participante
			// puede estar siendo editado por SERVIR
			estado = obj.getCod_estado();

			//listaFunciones = request.getParameter("tlistfuncion");

			if (accion != null) {
				if (tipoEdicion.equals("EDIT")) {
					editar = true;
					obj.setTipo_edicion(tipoEdicion);
				}
				if (tipoEdicion.equals("VALIDAR")) {
					validar = true;
					editar= true;
					tipoEdicion = "EDIT";
					obj.setTipo_edicion(tipoEdicion);
				}
				if (tipoEdicion.equals("INVALIDAR")) {
					invalidar = true;
					tipoEdicion = "";
					obj.setTipo_edicion(tipoEdicion);
				}
				if (tipoEdicion.equals("OBSERVAR")) {
					observar = true;
					tipoEdicion = "EDIT";
					obj.setTipo_edicion(tipoEdicion);
				}
				if (tipoEdicion.equals("SUBSANAR")) {
					subsanar = true;
					tipoEdicion = "EDIT";
					obj.setTipo_edicion(tipoEdicion);
				}
				if (tipoEdicion.equals("REENVIACORREO")) {
					reenviarcorreo = true;
					tipoEdicion = "";
					obj.setTipo_edicion(tipoEdicion);
				}
				if (tipoEdicion.equals("ENVIARNUEVOCORREO")) {
					reenviarNuevoCorreo = true;
					tipoEdicion = "";
					obj.setTipo_edicion(tipoEdicion);
				}
				

//				System.out.println("Nuevo tipoEdicion : " + tipoEdicion);

				if (editar) {
					Boolean validoEdicion = false;
					// Validamos los datos
					String flagDNI;
					flagDNI = capacidadesService.VerificarExisteOtroDNI(dni,
							idAmbito, idServicioCivil);
					if (!flagDNI.equals("")) {
						mensaje = "No se completo el grabado, ya se encuentra registrada una persona con el mismo 'Nro. de Documento'. Por favor verifique los datos ingresados.";
						obj.setMensaje(mensaje);

						// if (tipoEdicion.equals("NEW"))
						// {
						// Antes de retornar obtener la seleccion de
						//String[] arrayFunciones = listaFunciones.split(",");
						List<Number> arrayNumFunciones = new ArrayList<Number>();

						for (int i = 0; i < arrayFunciones.length; i++) {
							arrayNumFunciones.add(Integer
									.parseInt(arrayFunciones[i]));
						}
						//validamos ahora funciones personalizadas
						etapas = capacidadesService.ObtenerEtapasAmbitoPersonalizado(idAmbito,idEjecutora,isFuncionPersonalizada,obj.getId_sistema_etapa());
						
						validarPersonalizada="[]";
						if(validarPersonalizada.equals(String.valueOf(etapas))){
							etapas = capacidadesService.ObtenerEtapasNivelGobierno(idNivelGobierno, aplicaFuncionPersonalizada);
						}
						obj.setEtapas(etapas);
						obj.setId_funciones_participante(arrayNumFunciones);
						for (Etapa etapa : etapas) {
							for (FuncionLeyenda funcion : etapa.getFunciones()) {
								for (Number id_fun_sel : arrayNumFunciones) {
									if (funcion.getId_funcion().intValue() == id_fun_sel
											.intValue()) {
										funcion.setChecked(1);
									}
								}
							}
						}
						return obj;
						// }
					}

					flagDNI = capacidadesService.VerificarExisteOtroCorreo(
							correo, idAmbito, idServicioCivil);
					if (!flagDNI.equals("")) {
						mensaje = "No se completo el grabado, ya se encuentra registrada una persona con el mismo 'Corrreo Electrónico'. Por favor verifique los datos ingresados.";
						obj.setMensaje(mensaje);

						// if (tipoEdicion.equals("NEW"))
						// {
						// Antes de retornar obtener la seleccion de
						//String[] arrayFunciones = listaFunciones.split(",");
						List<Number> arrayNumFunciones = new ArrayList<Number>();

						for (int i = 0; i < arrayFunciones.length; i++) {
							arrayNumFunciones.add(Integer
									.parseInt(arrayFunciones[i]));
						}
						etapas = capacidadesService.ObtenerEtapasAmbitoPersonalizado(idAmbito,idEjecutora,isFuncionPersonalizada,obj.getId_sistema_etapa());
						
						validarPersonalizada="[]";
						if(validarPersonalizada.equals(String.valueOf(etapas))){
							etapas = capacidadesService.ObtenerEtapasNivelGobierno(idNivelGobierno, aplicaFuncionPersonalizada);
						}
						obj.setEtapas(etapas);
						obj.setId_funciones_participante(arrayNumFunciones);
						for (Etapa etapa : etapas) {
							for (FuncionLeyenda funcion : etapa.getFunciones()) {
								for (Number id_fun_sel : arrayNumFunciones) {
									if (funcion.getId_funcion().intValue() == id_fun_sel
											.intValue()) {
										funcion.setChecked(1);
									}
								}
							}
						}
						return obj;
						// }
					} else {
						if (tipoEdicion.equals("NEW"))
							validoEdicion = true;
					}

//					System.out.println("validoEdicion : " + validoEdicion);
					// verificamos si se ha cambiado el nro de DNI
					if (!tipoEdicion.equals("NEW")) {
						String vdni = obj.getDni();
						String vdniPrevio = obj.getDniPrevio();
						if (!vdni.equals(vdniPrevio)) {
							// se ha cambiado de DNI a la persona
							// El nuevo DNI no debe estar ya incluido para la
							// ejecutora
							if (flagDNI.equals("")) {
								validoEdicion = true;
								// Eliminar registros previos del DNI
								// //capacidadesService.EliminarServicioCivil(obj);
								// EL tipo de edicion debe funcionar como el
								// caso de nuevos
								// //tipoEdicion = "NEW";
							}
						} else if (vdni.equals(vdniPrevio)) {
							// significa que estoy editando
							if (!flagDNI.equals("")) {
								validoEdicion = true;
								flagDNI = "";
							}
						}

					}

					if (tipoEdicion.equals("NEW") & validoEdicion) {
						obj.setId_persona(0);
						// el estado no debe varias respecto al primero
						obj.setCod_estado(estado);
						String lastIdSC = capacidadesService.AgregarServicioCivil(obj);
						if (!lastIdSC.equals("") && idAmbito != null	&& idAmbito.intValue() > 0) {
							capacidadesService.AgregarFuncionesSC(Integer.parseInt(lastIdSC), listaFunciones,idAmbito);
							obj.setId_servicio_civil(Integer.parseInt(lastIdSC));
						}
						idFuncionesParticipante = capacidadesService.ObtenerIdFuncionesSC(Integer.parseInt(lastIdSC));
						etapas = capacidadesService.ObtenerEtapasAmbitoPersonalizado(idAmbito,idEjecutora,isFuncionPersonalizada,obj.getId_sistema_etapa());
						
						validarPersonalizada="[]";
						if(validarPersonalizada.equals(String.valueOf(etapas))){
							etapas = capacidadesService.ObtenerEtapasNivelGobierno(idNivelGobierno, aplicaFuncionPersonalizada);
						}
						obj.setEtapas(etapas);
						obj.setId_funciones_participante(idFuncionesParticipante);
						for (Etapa etapa : etapas) {
							for (FuncionLeyenda funcion : etapa.getFunciones()) {
								for (Number id_fun_sel : idFuncionesParticipante) {
									if (funcion.getId_funcion().intValue() == id_fun_sel
											.intValue()) {
										funcion.setChecked(1);
									}
								}
							}
						}
						obj.setTipo_edicion("EDIT");
						mensaje = "Los datos fueron grabados correctamente. ";
					}
					// else if (tipoEdicion.equals("EDIT") & validoEdicion ) {
					else if (tipoEdicion.equals("EDIT")) {
						capacidadesService.EditarServicioCivil(obj);
						if (idAmbito != null && idAmbito.intValue() > 0) {
							capacidadesService.AgregarFuncionesSC(
									obj.getId_servicio_civil(), listaFunciones,
									idAmbito);
						}
						idFuncionesParticipante = capacidadesService
								.ObtenerIdFuncionesSC(idServicioCivil);
						etapas = capacidadesService.ObtenerEtapasAmbitoPersonalizado(idAmbito,idEjecutora,isFuncionPersonalizada,obj.getId_sistema_etapa());
						
						validarPersonalizada="[]";
						if(validarPersonalizada.equals(String.valueOf(etapas))){
							etapas = capacidadesService.ObtenerEtapasNivelGobierno(idNivelGobierno, aplicaFuncionPersonalizada);
						}
						obj.setEtapas(etapas);
						obj.setId_funciones_participante(idFuncionesParticipante);
						for (Etapa etapa : etapas) {
							for (FuncionLeyenda funcion : etapa.getFunciones()) {
								for (Number id_fun_sel : idFuncionesParticipante) {
									if (funcion.getId_funcion().intValue() == id_fun_sel
											.intValue()) {
										funcion.setChecked(1);
									}
								}
							}
						}
						mensaje = "Los datos fueron actualizados correctamente. ";
					}
				}
				if (validar) {
					capacidadesService.grabarValidacion(obj);
					mensaje = "Se registró la validación del participante.";
					obj.setCod_estado("VALI");
					obj.setEstado_validacion("1");
					obj.setTipo_edicion("EDIT");
				}
				if (invalidar) {
					capacidadesService.grabarInvalidacion(obj);
					mensaje = "Se retiró la validación del registro del participante.";
					obj.setCod_estado("CONF");
					obj.setEstado_validacion("0");
				}
				if (observar) {
					capacidadesService.grabarObservacion(obj);
					mensaje = "Se registró la observación para el participante.";
					obj.setCod_estado("OBSE");
					obj.setEstado_observacion("1");
					obj.setTipo_edicion("VER");
				}
				if (subsanar) {
					capacidadesService.grabarSubsanacion(obj);
					mensaje = "Se registró la subsanación para el participante.";
					obj.setCod_estado("CONF");
					obj.setEstado_subsanacion("1");
				}
				if (reenviarcorreo) {
					mensaje = capacidadesService.recuperarClave(dni, idSistema);
					String[] resultados = mensaje.split("&");
					mensaje = resultados[1];
				}

				if (reenviarNuevoCorreo) {
					mensaje = capacidadesService.recuperarNuevaClave(obj);
					String[] resultados = mensaje.split("&");
					mensaje = resultados[1];
				}

				if (tipoEdicion.equals("GRABAR_PROFESION")) {
					String profesion_descripcion = request
							.getParameter("profesion_descripcion");
					String cod_profesion = null;
					if (!request.getParameter("cod_profesion").equals(""))
						cod_profesion = request.getParameter("cod_profesion");
					Profesion profesion = new Profesion();
					profesion.setDesc_profesion(profesion_descripcion
							.toUpperCase());
					profesion.setCod_profesion(cod_profesion);
					cod_profesion = mantenimientoService
							.grabarProfesion(profesion);
					mensaje = "Datos grabados correctamente.";
					obj.setProfesiones(capacidadesService.ObtenerProfesion());
				} else if (tipoEdicion.equals("BORRAR_PROFESION")) {
					if (request.getParameter("cod_profesion") != null
							&& !request.getParameter("cod_profesion")
									.equals("")) {
						String cod_profesion = request
								.getParameter("cod_profesion");
						mensaje = mantenimientoService
								.validarEliminarProfesion(cod_profesion);
						if (mensaje.equals("")) {
							mantenimientoService
									.eliminarProfesion(cod_profesion);
							mensaje = "Profesion eliminada correctamente";
							obj.setProfesiones(capacidadesService
									.ObtenerProfesion());
						}
					}
				} else if (tipoEdicion.equals("GRABAR_REGIMEN")) {
					String regimen_descripcion = request
							.getParameter("regimen_descripcion");
					String cod_regimen = null;
					if (!request.getParameter("cod_regimen").equals(""))
						cod_regimen = request.getParameter("cod_regimen");
					Regimen regimen = new Regimen();
					regimen.setDesc_regimen(regimen_descripcion.toUpperCase());
					regimen.setCod_regimen(cod_regimen);
					cod_regimen = mantenimientoService.grabarRegimen(regimen);
					mensaje = "Datos grabados correctamente.";
					obj.setRegimenes(capacidadesService.ObtenerRegimen());
				} else if (tipoEdicion.equals("BORRAR_REGIMEN")) {
					if (request.getParameter("cod_regimen") != null
							&& !request.getParameter("cod_regimen").equals("")) {
						String cod_regimen = request
								.getParameter("cod_regimen");
						mensaje = mantenimientoService
								.validarEliminarRegimen(cod_regimen);
						if (mensaje.equals("")) {
							mantenimientoService.eliminarRegimen(cod_regimen);
							mensaje = "Profesion eliminada correctamente";
							obj.setRegimenes(capacidadesService
									.ObtenerRegimen());
						}
					}
				}

			}
		}

		if (obj.getCorreo() != null)
			obj.setCorreo(obj.getCorreo().toLowerCase());
		if (obj.getCorreo_alterno() != null)
			obj.setCorreo_alterno(obj.getCorreo_alterno().toLowerCase());
		obj.setMensaje(mensaje);
		// obj.setUsuario(usuario);
		return obj;
	}
}
